package com.crazy.service.sys;

import java.io.Serializable;
import java.util.List;

import org.hibernate.criterion.Order;
import org.springframework.data.domain.Page;

/**
 * Service基础类——接口
 * 
 * @author Zhang Weiwei
 * @since 2013-9-20下午2:06:37
 */
public interface BaseService<Entity> {
	/**
	 * 删除对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:54:31
	 * @param entity
	 *            实体对象
	 */
	void delete(Entity entity);

	/**
	 * 按主键删除对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:54:37
	 * @param pk
	 *            主键
	 */
	<PK> void deleteByPK(PK pk);

	/**
	 * 分页查询所有对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-10-1下午12:33:08
	 * @param pageNum
	 *            当前页号
	 * @param pageSize
	 *            每页数量
	 * @param orders
	 *            排序
	 * @return
	 */
	Page<Entity> findAll(Integer pageNum, Integer pageSize, Order... orders);

	/**
	 * @param maxRow
	 *            最大记录数
	 * @param orders
	 *            排序
	 * @return
	 */
	List<Entity> findAll(Integer maxRow, Order... orders);

	/**
	 * 按条件查询所有对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:55:18
	 * @param orders
	 *            排序
	 * @return
	 */
	List<Entity> findAll(Order... orders);

	/**
	 * 按条件查询所有对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:55:30
	 * @param entity
	 *            实体对象
	 * @param excludeZeroes
	 *            排除0
	 * @param excludeNone
	 *            排除空值
	 * @param enableLike
	 *            启用模糊
	 * @param ignoreCase
	 *            忽略大小写
	 * @param orders
	 *            排序
	 * @return
	 */
	List<Entity> findByExample(Entity entity, Boolean excludeZeroes,
			Boolean excludeNone, Boolean enableLike, Boolean ignoreCase,
			Order... orders);

	/**
	 * 按条件查询所有对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:55:21
	 * @param entity
	 *            实体对象
	 * @param orders
	 *            排序
	 * @return
	 */
	List<Entity> findByExample(Entity entity, Order... orders);

	/**
	 * 按条件查询所有对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:55:25
	 * @param propertyName
	 *            属性名
	 * @param value
	 *            属性值
	 * @param orders
	 *            排序
	 * @return
	 */
	List<Entity> findByProperty(String propertyName, Object value,
			Order... orders);

	/**
	 * 按条件查询唯一对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:54:58
	 * @param propertyName
	 *            属性名
	 * @param value
	 *            属性值
	 * @return
	 */
	Entity findUniqueResult(String propertyName, Object value);

	/**
	 * 按条件查询所有对象（使用“in”）
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-24下午9:17:28
	 * @param propertyName
	 *            属性名
	 * @param values
	 *            属性值数组
	 * @return
	 */
	List<Entity> findUseInOfArray(String propertyName, Object... values);

	/**
	 * 按主键查询对象（立即加载）
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:54:41
	 * @param pk
	 *            主键
	 * @return
	 */
	Entity get(Serializable pk);

	/**
	 * 按主键查询对象（延时加载）
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:54:45
	 * @param pk
	 *            主键
	 * @return
	 */
	Entity load(Serializable pk);

	/**
	 * 保存对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:54:48
	 * @param entity
	 *            实体对象
	 * @return
	 */
	Entity save(Entity entity);

	/**
	 * 保存或更新对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:54:52
	 * @param entity
	 *            实体对象
	 * @return
	 */
	Entity saveOrUpdate(Entity entity);

	/**
	 * 更新对象
	 * 
	 * @author Zhang Weiwei
	 * @since 2013-9-21下午8:54:55
	 * @param entity
	 *            实体对象
	 * @return
	 */
	Entity update(Entity entity);
}
